package compilador.semantico;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

public class Tipo implements Variavel {
	private String nome;
	private String tipo;

	private HashMap<String, Atributo> atts = new HashMap<String, Atributo>();
	private HashMap<String, Metodo> metodos = new HashMap<String, Metodo>();
	
	@SuppressWarnings("unchecked")
	public Tipo(String nome, Tipo pai) {
		this.nome = nome;
		this.tipo = pai.tipo;
		this.atts = (HashMap<String, Atributo>) pai.atts.clone();
		this.metodos = (HashMap<String, Metodo>) pai.metodos.clone();
	}
	
	public Tipo(String nome) {
		this.nome = this.tipo = nome;
	}

	public String getNome() {
		return nome;
	}

	public String getTipo() {
		return tipo;
	}

	public boolean temFilhos() {
		return true;
	}

	public boolean temParametros() {
		return false;
	}

	public void addMetodo(Metodo metodo) {
		this.metodos.put(metodo.getNome(), metodo);
	}

	public void addAtributo(Atributo att) {
		this.atts.put(att.getNome(), att);
	}

	public Variavel getFilho(String nome) {
		if (this.metodos.containsKey(nome))
			return this.metodos.get(nome);
		else if (this.atts.containsKey(nome))
			return this.atts.get(nome);
		else
			return null;
	}
	
	public Collection<Atributo> getAtributos() {
		Collection<Atributo> result = new ArrayList<Atributo>(this.atts.size());
		for(String att : this.atts.keySet()) {
			result.add(this.atts.get(att));
		}
		
		return result;
	}
	
	public Collection<Metodo> getMetodos() {
		Collection<Metodo> result = new ArrayList<Metodo>(this.metodos.size());
		for(String met : this.metodos.keySet()) {
			result.add(this.metodos.get(met));
		}
		
		return result;
	}
	
	@Override
	public String toString() {
		StringBuilder buf = new StringBuilder();
		for(String att : atts.keySet()) {
			buf.append(atts.get(att).toString());
			buf.append('\n');
		}
		for(String met : metodos.keySet()) {
			buf.append(metodos.get(met).toString());
		}
		return buf.toString();
	}

}
